package demo.ClassLoad;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/5-08-05-10:06
 * @Description：demo.ClassLoad
 */
public class reflect_classInfo {
    public static void main(String[] args) throws NoSuchFieldException {
        Class<Student> c = Student.class;

        //字段  Field
        Field[] fields = c.getFields();       //获取所有共用字段，包括父类字段
        for (Field field : fields) {
            System.out.println("修饰符： " + Modifier.toString(field.getModifiers()) + "， 参数类型："+ field.getType() + "， 变量名： " + field.getName());
        }

        Field name = c.getField("name");    //获取指定字段
        System.out.println(name.getName());


        Field[] fields2 = c.getDeclaredFields();      //获取所有声明的字段，包括私有，不能获取父类的字段
        for (Field field : fields2) {
            System.out.println("修饰符： " + Modifier.toString(field.getModifiers()) + "， 参数类型："+ field.getType() + "， 变量名： " + field.getName());
        }
        //方法
            // 公有方法
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println("修饰符: " + Modifier.toString(method.getModifiers()) + ", 返回类型: " + method.getReturnType().getName() +
                    ", 方法名称：" + method.getName() + ", 参数类型：" + Arrays.toString(method.getParameterTypes()) + ", 参数个数: " + method.getParameterCount()
                    + ", 异常类型： " + Arrays.toString(method.getExceptionTypes())
            );
        }
        System.out.println("-----------------------------------------");
        //私有方法
        Method[] methods2 = c.getDeclaredMethods();
        for (Method method : methods2) {
            System.out.println("修饰符: " + Modifier.toString(method.getModifiers()) + ", 返回类型: " + method.getReturnType().getName() +
                    ", 方法名称：" + method.getName() + ", 参数类型：" + Arrays.toString(method.getParameterTypes()) + ", 参数个数: " + method.getParameterCount()
                    + "异常类型： " + Arrays.toString(method.getExceptionTypes())
            );
            if(method.isAnnotationPresent(Role.class)){      //获取方法上的注解
                System.out.println(method.getName());
            }
        }
        System.out.println("-----------------------------------------------");
        //构造器
        Constructor[] constructors = c.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("修饰符: " + Modifier.toString(constructor.getModifiers()) +
                    ", 方法名称：" + constructor.getName() + ", 参数类型：" + Arrays.toString(constructor.getParameterTypes()) + ", 参数个数: "
                    + constructor.getParameterCount()
                    + "异常类型： " + Arrays.toString(constructor.getExceptionTypes())
            );
        }
        //注解
        //获取方法上的注解  看第50行
        Annotation[] annotations = c.getAnnotations();       //获取类上的注解
        System.out.println(Arrays.toString(annotations));
        System.out.println(c.isAnnotationPresent(Role.class));
        if(c.isAnnotationPresent(Role.class)){
            Role role = c.getAnnotation(Role.class);
            System.out.println(role.name());    //admin
        }

    }
}
